package com.zhanghp.class01;

import static com.zhanghp.utils.CommonUtils.TEST_COUNT;
import static com.zhanghp.utils.CommonUtils.*;
import static java.lang.Math.*;

/**
 * 1. 如何用1~5的随机函数加工出1~7的随机函数
 *
 * @author zhanghp
 * @date 2023/7/31 12:45
 */
public class Code06_RandToRand {
    public static void main(String[] args) {
//        verifyBlackBoxOneToFive();
//        verifyf1();
//        verifyf2();
//        verifyE2();
        printDivingLine();
    }

    /**
     * 黑盒函数：等概率返回1-5
     *
     * @return [1, 5]
     */
    public static int blackBoxOneToFive() {
        return ((int) (random() * 5)) + 1;
    }

    /**
     * 如何用等概率1~5的随机函数加工出1~7的随机函数
     * <p>1. 利用等概率返回1-5的函数，等概率返回0,1</p>
     */
    public static int f1() {
        int var;
        do {
            var = blackBoxOneToFive();
        } while (var == 3);
        return var < 3 ? 0 : 1;
    }

    /**
     * 如何用等概率1~5的随机函数加工出1~7的随机函数
     * <p>2. 等概率返回0-6</p>
     *
     * @return [0,6]
     */
    public static int f2() {
        int var;
        do {
            var = (f1() << 2) + (f1() << 1) + f1();
        } while (var == 7);
        return var;
    }

    /**
     * 如何用等概率1~5的随机函数加工出1~7的随机函数
     * <p>3. 等概率返回1-7</p>
     *
     * @return [1,7]
     */
    public static int f3() {
        return f2() + 1;
    }


    /**
     * 验证黑盒函数：是否等概率返回1-5
     */
    public static void verifyBlackBoxOneToFive() {
        int[] arr = new int[5];
        for (int i = 0; i < TEST_COUNT; i++) {
            arr[blackBoxOneToFive() - 1]++;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.printf("%s%n", (i + 1) + ": " + ((double) arr[i]) / TEST_COUNT);
        }
    }

    /**
     * 验证f1()是否等概率返回0,1
     */
    public static void verifyf1() {
        int count = 0;
        for (int i = 0; i < TEST_COUNT; i++) {
            if (f1() == 0) {
                count++;
            }
        }
        System.out.printf("%s%n", (double) count / TEST_COUNT);
    }

    /**
     * 验证f2()0是否等概率返回[1,7]
     */
    public static void verifyf2() {
        int[] arr = new int[7];
        for (int i = 0; i < TEST_COUNT; i++) {
            arr[f3()]++;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.printf("%-10s%s%n", (i + 1) + "出现的概率:", ((double) arr[i]) / TEST_COUNT);
        }
    }
}
